package cn.csc.module.shoppingCard.service.card;

import cn.csc.framework.common.pojo.PageResult;
import cn.csc.module.shoppingCard.api.card.dto.CardMultiLockReqDTO;
import cn.csc.module.shoppingCard.controller.admin.card.vo.CardCreateReqVO;
import cn.csc.module.shoppingCard.controller.admin.card.vo.CardExportReqVO;
import cn.csc.module.shoppingCard.controller.admin.card.vo.CardPageReqVO;
import cn.csc.module.shoppingCard.controller.admin.card.vo.CardUpdateReqVO;
import cn.csc.module.shoppingCard.controller.app.card.vo.AppCardActivateReqVO;
import cn.csc.module.shoppingCard.dal.dataobject.card.CardDO;
import com.baomidou.mybatisplus.extension.service.IService;

import javax.validation.Valid;
import java.math.BigInteger;
import java.util.Collection;
import java.util.List;

/**
 * 购物卡主表 Service 接口
 *
 * @author liuchuang
 */
public interface CardService extends IService<CardDO> {

    /**
     * 创建购物卡主表
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    BigInteger createCard(@Valid CardCreateReqVO createReqVO);

    /**
     * 更新购物卡主表
     *
     * @param updateReqVO 更新信息
     */
    void updateCard(@Valid CardUpdateReqVO updateReqVO);

    /**
     * 激活购物卡
     * @param reqVO
     */
    BigInteger activate(AppCardActivateReqVO reqVO);

    /**
     * 锁定购物卡
     * @param userId 用户ID
     * @param cardId 购物卡ID
     * @param orderId 订单ID
     * @return
     */
    int lockCard(BigInteger userId, BigInteger cardId, BigInteger orderId);

    /**
     * 锁定购物卡
     * @param list 参数
     * @return
     */
    Boolean multiLockCard(List<CardMultiLockReqDTO> list);

    /**
     * 解锁购物卡
     * @param userId 用户ID
     * @param cardId 购物卡ID
     * @param orderId 订单ID
     * @return
     */
    int unLockCard(BigInteger userId, BigInteger cardId, BigInteger orderId);

    /**
     * 解锁购物卡
     * @param orderIds
     * @return
     */
    int unLockCard(List<BigInteger> orderIds, BigInteger userId);

    /**
     * 删除购物卡主表
     *
     * @param id 编号
     */
    void deleteCard(BigInteger id);

    /**
     * 获得购物卡主表
     *
     * @param id 编号
     * @return 购物卡主表
     */
    CardDO getCard(BigInteger id);

    /**
     * 获得购物卡主表列表
     *
     * @param ids 编号
     * @return 购物卡主表列表
     */
    List<CardDO> getCardList(Collection<BigInteger> ids);

    /**
     * 通过userId获得购物卡主表列表
     *
     * @param userId 用戶编号
     * @return 购物卡主表列表
     */
    List<CardDO> selectListByUserId(BigInteger userId);

    /**
     * 获得购物卡主表分页
     *
     * @param pageReqVO 分页查询
     * @return 购物卡主表分页
     */
    PageResult<CardDO> getCardPage(CardPageReqVO pageReqVO);

    /**
     * 获得购物卡主表列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 购物卡主表列表
     */
    List<CardDO> getCardList(CardExportReqVO exportReqVO);

}
